package quee;

import java.util.Stack;

public class huanxing {
    public static void main(String[] args) {
        circleQueue circleQueue = new circleQueue(4);
        circleQueue.showQueue();
        circleQueue.addQueue(1);
        circleQueue.showQueue();
        circleQueue.addQueue(2);
        circleQueue.showQueue();
        circleQueue.addQueue(3);
        circleQueue.showQueue();
        circleQueue.addQueue(4);
        circleQueue.showQueue();

    }
}
/**
 * front含义做出调整 指向第一个元素 而不是前面 front=0
 * rear 也调整 指向最后元素的后一个位置，空出一个位置作为约定 rear=0
 * 当队列满时， 原来的条件是 rear==maxSize -1  现在改为 (rear+1)%maxSize=front(满）
 * 因为要预留一个空间 所以rear +1 如果front 一直是零的话 就是整除 取出一个前移一位 放进一个后移一位0,10--1,1 而maxSize一直是10
 * 为空的条件是rear==front
 * 队列有效数据的个数是 （rear +maxSize-front)%maxSize
 */
class circleQueue{
    private int maxSize;
    private int front;//队列头
    private int rear; //队列尾
    private int[] arr;//存放数据 ，模拟队列
    public circleQueue(int arrMaxSize){
        maxSize=arrMaxSize;
        arr=new int[maxSize];//空出一个位置
        front=0;//指向队列的头部前一个位置
        rear=0;//指向队列尾部的具体位置，就是队列最后一个数据的位置
    }
public boolean isFull(){
        return (rear+1)%maxSize==front;
}
public boolean isEmpty(){
        return rear==front;
}
public void addQueue(int i){
        if (isFull()){
            System.out.println("已经满了");
            return;
        }
        arr[rear]=i;
        //先后移 必须考虑取模 ，即不能越界 如果大了 就把rear 放在前面取模
    /**
     * rear最大时  (rear+1)%maxSize 会等于front 9+1/10 rear 的位置不可能超过maxSize
     * 因为会循环，不可能越界
     */
        rear=(rear+1)%maxSize;
}
public  int getQueue(){

        if (isEmpty()){

            throw new  RuntimeException("空了");
        }
         int value=arr[front];
        front=(front +1)%maxSize;
        return value;

}

    public void showQueue(){
        if (isEmpty()){
            System.out.println("没有数据");
            return;
        }

        //从front 开始遍历 遍历多少个元素
        for (int i=front;i<front+size();i++){
            System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
        }
    }
    //求出当前队列有效数据 的个数
    public  int size(){
        //rear
       return  (rear +maxSize-front)%maxSize;
    }
    public  int headQueue(){
        if (isEmpty()){
            throw new RuntimeException("队列空，不能获取数据");

        }
        return arr[front+1];
    }
}



